home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / lightning-0.8-tb-win.xpi / chrome / calendar.jar / content / calendar / sun-calendar-event-dialog-reminder.js < prev    next >
Text File  |  2007-09-22  |  11KB  |  310 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Sun Microsystems code.
  15.  *
  16.  * The Initial Developer of the Original Code is Sun Microsystems.
  17.  * Portions created by the Initial Developer are Copyright (C) 2006
  18.  * the Initial Developer. All Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *   Michael Buettner <michael.buettner@sun.com>
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. function onLoad() {
  38.     var args = window.arguments[0];
  39.     window.onAcceptCallback = args.onOk;
  40.  
  41.     // set the current date/time for the duedate control.
  42.     // this is just a placeholder until we support absolute reminders.
  43.     var duedate = document.getElementById("reminder-duetime");
  44.     duedate.value = new Date();
  45.  
  46.     // load the reminders from preferences
  47.     var reminders = loadReminders();
  48.  
  49.     // check if a possibly incoming reminder object matches
  50.     // the ones we already know about...
  51.     var incoming = args.reminder;
  52.     var selectedIndex = -1;
  53.     if (incoming) {
  54.         for (var i = 0; i < reminders.length; i++) {
  55.             var reminder = reminders[i];
  56.             if (reminder.relation == incoming.relation &&
  57.                 reminder.length == incoming.length &&
  58.                 reminder.unit == incoming.unit) {
  59.                 selectedIndex = i;
  60.                 break;
  61.             }
  62.         }
  63.  
  64.         // if we didn't find a match, we append the unknown
  65.         // reminder to the array of custom reminders.
  66.         if (selectedIndex < 0) {
  67.             reminders.push(incoming);
  68.             selectedIndex = reminders.length - 1;
  69.         }
  70.     }
  71.  
  72.     var listbox = document.getElementById("reminder-listbox");
  73.     while (listbox.childNodes.length > reminders.length) {
  74.         listbox.removeChild(listbox.lastChild);
  75.     }
  76.     var numChilds = listbox.childNodes.length;
  77.     for (var i = 0; i < reminders.length; i++) {
  78.         if (i >= numChilds) {
  79.             var newNode = listbox.childNodes[0].cloneNode(true);
  80.             listbox.appendChild(newNode);
  81.         }
  82.         var node = listbox.childNodes[i];
  83.         var reminder = reminders[i];
  84.         var details = stringFromReminderObject(reminder);
  85.         node.setAttribute('label', details);
  86.         node.reminder = reminder;
  87.     }
  88.  
  89.     if (selectedIndex < 0) {
  90.         selectedIndex = 0;
  91.     }
  92.     listbox.selectedIndex = selectedIndex;
  93.  
  94.     opener.setCursor("auto");
  95. }
  96.  
  97. function stringFromReminderObject(reminder) {
  98.     var sbs = Components.classes["@mozilla.org/intl/stringbundle;1"]
  99.               .getService(Components.interfaces.nsIStringBundleService);
  100.  
  101.     var props =
  102.         sbs.createBundle(
  103.             "chrome://calendar/locale/sun-calendar-event-dialog.properties");
  104.  
  105.     var unitString;
  106.     switch (reminder.unit) {
  107.         case 'minutes':
  108.             unitString = Number(reminder.length) <= 1 ?
  109.                 props.GetStringFromName('reminderCustomUnitMinute') :
  110.                 props.GetStringFromName('reminderCustomUnitMinutes');
  111.             break;
  112.         case 'hours':
  113.             unitString = Number(reminder.length) <= 1 ?
  114.                 props.GetStringFromName('reminderCustomUnitHour') :
  115.                 props.GetStringFromName('reminderCustomUnitHours');
  116.             break;
  117.         case 'days':
  118.             unitString = Number(reminder.length) <= 1 ?
  119.                 props.GetStringFromName('reminderCustomUnitDay') :
  120.                 props.GetStringFromName('reminderCustomUnitDays');
  121.             break;
  122.     }
  123.  
  124.     var relationString;
  125.     switch (reminder.relation) {
  126.         case 'START':
  127.             relationString = props.GetStringFromName('reminderCustomRelationStart');
  128.             break;
  129.         case 'END':
  130.             relationString = props.GetStringFromName('reminderCustomRelationEnd');
  131.             break;
  132.     }
  133.  
  134.     var originString;
  135.     if (reminder.origin && reminder.origin < 0) {
  136.         originString = props.GetStringFromName('reminderCustomOriginEnd');
  137.     } else {
  138.         originString = props.GetStringFromName('reminderCustomOriginBegin');
  139.     }
  140.  
  141.     return props.formatStringFromName('reminderCustomTitle',
  142.                                       [reminder.length,
  143.                                        unitString,
  144.                                        relationString,
  145.                                        originString],
  146.                                       4);
  147. }
  148.  
  149. function loadReminders() {
  150.     var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  151.                       .getService(Components.interfaces.nsIPrefService);
  152.     var prefBranch = prefService.getBranch("calendar.reminder.");
  153.  
  154.     var pref = "length=15;unit=minutes;relation=START;origin=1,length=3;" +
  155.                "unit=hours;relation=START;origin=1";
  156.     try {
  157.         var newPref = prefBranch.getCharPref("custom");
  158.         if (newPref && newPref != "") {
  159.             pref = newPref;
  160.         }
  161.     } catch (ex) {
  162.     }
  163.  
  164.     var reminderArray = [];
  165.     var reminders = pref.split(',');
  166.     for each (var reminder in reminders) {
  167.         if (reminder.indexOf(';') >= 0) {
  168.             var object = {};
  169.             var attributes = reminder.split(';');
  170.             for each (var attribute in attributes) {
  171.                 var index = attribute.indexOf('=');
  172.                 if (index > 0) {
  173.                     var key = attribute.substring(0, index);
  174.                     var value = attribute.substring(index + 1,
  175.                                                     attribute.length);
  176.                     object[key] = value;
  177.                 }
  178.             }
  179.             reminderArray.push(object);
  180.         }
  181.     }
  182.  
  183.     return reminderArray;
  184. }
  185.  
  186. function saveReminders(reminderArray) {
  187.     var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  188.                       .getService(Components.interfaces.nsIPrefService);
  189.     var prefBranch = prefService.getBranch("calendar.reminder.");
  190.  
  191.     var result = "";
  192.     for each (var reminder in reminderArray) {
  193.         for (var key in reminder) {
  194.             result += key + '=' + reminder[key] + ';';
  195.         }
  196.         if (result.length && result[result.length - 1] == ';') {
  197.             result = result.substr(0, result.length - 1);
  198.         }
  199.         result += ',';
  200.     }
  201.     if (result.length && result[result.length - 1] == ',') {
  202.         result = result.substr(0, result.length - 1);
  203.     }
  204.  
  205.     prefBranch.setCharPref("custom", result);
  206. }
  207.  
  208. function onReminderSelected() {
  209.     var length = document.getElementById("reminder-length");
  210.     var unit = document.getElementById("reminder-unit");
  211.     var relation = document.getElementById("reminder-relation");
  212.     var origin = document.getElementById("reminder-origin");
  213.  
  214.     var listbox = document.getElementById("reminder-listbox");
  215.     var listitem = listbox.selectedItem;
  216.  
  217.     if (listitem) {
  218.         var reminder = listitem.reminder;
  219.         length.value = reminder.length;
  220.         unit.value = reminder.unit;
  221.         relation.value = reminder.relation;
  222.         origin.value = reminder.origin;
  223.     }
  224. }
  225.  
  226. function updateReminderLength(event) {
  227.     validateIntegers(event);
  228.     updateReminder();
  229. }
  230.  
  231. function updateReminder() {
  232.     var length = document.getElementById("reminder-length");
  233.     var unit = document.getElementById("reminder-unit");
  234.     var relation = document.getElementById("reminder-relation");
  235.     var origin = document.getElementById("reminder-origin");
  236.  
  237.     var listbox = document.getElementById("reminder-listbox");
  238.     var listitem = listbox.selectedItem;
  239.     var reminder = listitem.reminder;
  240.  
  241.     reminder.length = length.value;
  242.     reminder.unit = unit.value;
  243.     reminder.relation = relation.value;
  244.     reminder.origin = origin.value;
  245.  
  246.     var details = stringFromReminderObject(reminder);
  247.     listitem.setAttribute('label', details);
  248. }
  249.  
  250. function onNewReminder() {
  251.     var listbox = document.getElementById("reminder-listbox");
  252.     var listitem = listbox.selectedItem;
  253.     var reminder = listitem.reminder;
  254.     listbox.clearSelection();
  255.     var newNode = listitem.cloneNode(true);
  256.     var newReminder = {};
  257.     newReminder.length = reminder.length;
  258.     newReminder.unit = reminder.unit;
  259.     newReminder.relation = reminder.relation;
  260.     newReminder.origin = reminder.origin;
  261.     newNode.reminder = newReminder;
  262.     listbox.appendChild(newNode);
  263.     listbox.selectItem(newNode);
  264.  
  265.     var button = document.getElementById("reminder-delete");
  266.     if (listbox.childNodes.length > 1) {
  267.         button.removeAttribute('disabled');
  268.     } else {
  269.         button.setAttribute('disabled', 'true');
  270.     }
  271. }
  272.  
  273. function onDeleteReminder() {
  274.     var listbox = document.getElementById("reminder-listbox");
  275.     var listitem = listbox.selectedItem;
  276.     var selectitem = listitem.nextSibling;
  277.     if (!selectitem) {
  278.         selectitem = listitem.previousSibling;
  279.     }
  280.     listbox.clearSelection();
  281.     listbox.removeChild(listitem);
  282.     listbox.selectItem(selectitem);
  283.  
  284.     var button = document.getElementById("reminder-delete");
  285.     if (listbox.childNodes.length > 1) {
  286.         button.removeAttribute('disabled');
  287.     } else {
  288.         button.setAttribute('disabled', 'true');
  289.     }
  290. }
  291.  
  292. function onAccept() {
  293.     var array = [];
  294.     var listbox = document.getElementById("reminder-listbox");
  295.     var numChilds = listbox.childNodes.length;
  296.     for (var i = 0; i < numChilds; i++) {
  297.         var item = listbox.childNodes[i];
  298.         array.push(item.reminder);
  299.     }
  300.     saveReminders(array);
  301.  
  302.     var listitem = listbox.selectedItem;
  303.     window.onAcceptCallback(listitem.reminder);
  304.  
  305.     return true;
  306. }
  307.  
  308. function onCancel() {
  309. }
  310.